// #include <iostream>
// using namespace std;

// class Soultion
// {
// public:
//     long long quick_mi(long long base, long long power, long long mi)
//     {
//         long long result = 1;
//         while (power > 0)
//         {
//             if (power % 2 == 1)
//             {
//                 power = power - 1;
//                 result = base * result % mi;
//             }
//             power = power / 2;
//             base = base * base % mi;
//         }
//         return result;
//     }
// };

// int main()
// {
//     Soultion ss;
//     std::cout<<ss.quick_mi(2, 3, 5)<<std::endl;

//     return 0;
// }


#include <iostream>
#include <stdio.h>
#define p 43
#define q 59
#define e 13

int candp(int a,int b,int c);    //数据处理函数，实现幂的取余运算
int fun(int x,int y);			   //公钥e 与 t的互素判断
int main()
{
  int d, m, n, t, c, r;
  int m_t = 0, m_i = 0, m_j = 0;
  int ciphertext[100];             //存放密文的数组
  int proclaimedtext[100];         //存放明文的数组
  n = p * q;
  t = (p - 1) * (q - 1);							  //求n的欧拉数
  d = 1;
  while(((e * d) % t) != 1) d++;//由公钥e求出私钥d

  while(1)
  {
      printf("加密请输入 1  解密请输入 2\n");   //加密或解密选择
      scanf("%d",&r);
      switch(r)
      {
         case 1: 
               printf("请输入密文 m: ");       
               scanf("%d",&m);
               while(m / 100)
               {
                   m_t = m % 100;
                   ciphertext[m_i] = m_t;
                   proclaimedtext[m_i] = candp(m_t, e, n);
                   m /= 100;
                   m_i++;
               }
               ciphertext[m_i] = m;
               proclaimedtext[m_i] = candp(m, e, n);
               printf("明文为: \n");
               for(int i = 0 ; i <= m_i ;i++)
               {
                   printf("%d",proclaimedtext[i]);
               }
               printf("\n");
               break;
        case 2: 
               printf("明文为 c: ");         
               for(int i = 0 ; i <= m_i ;i++)
               {
                   printf("%d",proclaimedtext[i]);
               }
               printf("\n");
               while(m_i--)
               {
                  ciphertext[m_j] = candp(proclaimedtext[m_j], d, n);
                  m_j++;
               }
               printf("密文为: \n");
               for(int i = m_j ; i >= 0 ;i--)
               {
                   printf("%d",ciphertext[i]);
               }
               printf("\n");
               break;
      }
    }
}

int candp(int a, int b, int c)		//数据处理函数，实现幂的取余运算
{ 
   int r = 1;
   while(b-- != 0)
      r = (r * a) % c;
   return r;
}

int fun(int x, int y)			   //公钥e 与t 的互素判断
{
   int t;
   while(y)
   {
      t = x;
      x = y;
      y = t % y;
   }
   return x == 1 ? 0: 1;
}


